package com.togo.algorithm.easy.array;

/**
 * @Author taiyn
 * @Description
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 * 示例 2：
 *
 * 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 * 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 *  
 *
 * 限制：
 *
 * 0 <= matrix.length <= 100
 * 0 <= matrix[i].length <= 100
 *
 * @Date 9:59 AM 2023/5/25
 **/
public class Offer29 {

    /**
     * 设置四个边, l -> r , t -> b, r -> l, b -> t
     * @param matrix
     * @return
     */
    public int[] spiralOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0];

        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
        int[] result = new int[(r + 1) * (b + 1)];
        int x = 0;
        while(true) {
            for(int i = l; i <= r; i++) {
                result[x++] = matrix[t][i];
            }
            if(++t > b) break;
            for(int i = t; i <= b; i++) {
                result[x++] = matrix[i][r];
            }
            if(--r < l) break;
            for(int i = r; i >= l; i--) {
                result[x++] = matrix[b][i];
            }
            if(--b < t) break;
            for(int i = b; i >= t; i--) {
                result[x++] = matrix[i][l];
            }
            if(++l > r) break;
        }

        return result;
    }
}
